perm filename PPK.FAI[HAK,HPM]8 blob
sn#325287 filedate 1977-12-25 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00011 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE PPK
C00004 00003 START:
C00006 00004 MOVE A,LINN
C00007 00005 MOVEM A,LINN
C00012 00006 EINIT: SKIPE EINITD
C00014 00007 LINED: MOVE DAT,@LEENT append line editor
C00017 00008 LFEND: SKIPN NEEDLF check if last line had lf
C00019 00009 DISP1: MOVEI C,0
C00022 00010 RCHNW: MOVE C,[700,,WRD-1]
C00023 00011 APNT: (A). RH GETS CLOBBERED AT SETPR2 TIME
C00025 ENDMK
C⊗;
TITLE PPK
A←1
B←2
C←3
D←4
E←5
f←6
ppos← 7
pnt←10
len←11
NLFS←12
spos←13
DAT←14
CB←T←15
TT←16
P←17
LPDL←←69
BFSZ←←10000
SYSTOP←←265
CHKBEG←←223
LEBUF←←330 ;Displacement of actual line editor buffer from beginning of dpy hdr
LINK←←65 ;displacement in PP of link to next PP (DPYSER)
MAXWIN←←=33
WTXTSZ←←MAXWIN*=100/5
CDPYBS: 2450 ;value of DPYBSZ (from E) ***09/13/77 00:15--NOT USED***
ADPYBU: 1236 ;address of DPYBUF (from E) ***09/13/77 00:15--NOT USED***
AWINLI: 0;13217 ;address of WINLIN (from E)
ABOTST: 0;4123 ;address of BOTSTR (from E)
AHEDBL: 0;13223 ;address of HEDBLK (from E)
ATRLBL: 0;13222 ;address of TRLBLK (from E)
resstr: 4000,,520 ;<break>P
4000,,127 ;<esc>W
respag: resstr-.,,resstr
START:
SETZ B,
CALLI B,400062
CALLI A,24
HRRZ A,A
MOVEM A,TESTXX#
CAIE A,=154279
CAIN A,=199526
CAIA
CAIN A,=166957
MOVN B,[=30337167360]
CALLI B,43
MOVE C,[-1,,[015000,,D]]
TTYSET C, ;get display height in D
SUBI D,2 ;-2 for who line
MOVEM D,DPYHT
SETZM EMODE
SETOM LINN
BEG: MOVE P,[-LPDL,,PDL]
MOVEI A,LEBUF
PEEK A,
MOVEM A,DLEBUF ;Displacement of editor buffer from dpy hdr addr
MOVEI A,CHKBEG
PEEK A,
MOVEM A,CCHKBEG
LSH A,-9 ;# LO PIECE PAGES
MOVEI B,SYSTOP
PEEK B,
PEEK B,
MOVE C,CCHKBEG
SUB C,B
MOVEM C,CBMST ;CHKBEG-SYSTOP
LSH B,-9+5 ;STARTING HI PIECE PAGE # * 40
ADDI B,10 ;SET 2-PIECE FLAG
HRL B,A
MOVEM B,XGETHI
GETHI B,
JRST 4,.
MOVE A,400321
HLRZM A,TBLKPT
HRRZM A,TPJMP
MOVE A,400322
HRRZM A,PPCALL
MOVE A,400236
MOVEM A,JBTLIN
MOVE A,400237
MOVEM A,LETAB
MOVE A,LINN
JUMPGE A,BEG2
OUTSTR [ASCIZ/Line? /]
NXCH: INCHWL A
HACH: CAIN A,175
JRST [ EXIT 1,↔ JRST START ]
CAIN A,15
JRST [ INCHWL
EXIT 1,
JRST START]
CAIE A,11
CAIN A,40
JRST NXCH
SUBI A,60
REELUP: INCHWL C
CAIN C,15
JRST [INCHRW T
JRST BEG3A]
LSH A,3
ADDI A,-"0"(C)
JRST REELUP
BEG3A: push p,a
push p,b
lsh a,9 ;type <brk> <line number> W
add a,[4000,,727]
hrroi b,a
ttyset b,
pop p,b
pop p,a
MOVEM A,LINN
BEG2: ADD A,LETAB
MOVEI B,400000-20(A)
MOVEM B,LEENT
HRRZ A,400000-20(A)
JUMPE A,[ OUTSTR [ASCIZ/Not in use or not a display.
/]
JRST START]
MOVE T,CBMST
ADDI T,400000
HRRM T,APNT
SUBI T,2
HRLI T,-20
MOVSM T,JMPOFF
ADD A,PPCALL
HLRZ A,@APNT
SKIPN EMODE
JRST NEMODE
MOVE B,A
ADDI A,LINK ;go to secondary PP if E mode
HRRZ A,@APNT
SKIPN A ;but not if there isn't one
MOVE A,B
NEMODE: MOVEI B,1(A)
ADD B,TPJMP
HRLM B,ENDTST
ADD A,TBLKPT
HRRZ A,@APNT
ADD A,APNT
HRLI A,444400
MOVEM A,DLISTL
SETZM CCNT
MOVNI A,69
MOVEM A,BLKCNT
SKIPN EMODE
JRST NEMOD2
PUSHJ P,EINIT
JRST NEMOD2 ;EINIT failed
MOVEI A,B
MOVE B,LINN
TTYJOB B,
HRRO C,AWINLI
MOVEI D,WINLIN
JOBRD A,
JRST NEMOD2
MOVE C,WINLIN
MOVEM C,ANXTLN
MOVE C,[WINBLK,,WINBLK+1]
SETZM -1(C)
BLT C,WINBLK+MAXWIN-1
MOVE E,[-MAXWIN-1,,WINBLK-1] ;pointer list
MOVE F,[-WTXTSZ+40,,WINTXT] ;text storage
HRRO C,AHEDBL
MOVEI D,HEDBLK
JOBRD A,
JRST NEMOD2
HRRO C,ATRLBL
MOVEI D,TRLBLK
JOBRD A,
JRST NEMOD2
MOVE C,HEDBLK
ADD C,[-40,,-1]
HRRZ D,F
JOBRD A,
JRST NEMOD2
HRRZ C,(F) ;total wdcount
ADDI C,-2(F) ;last text wd
HRLZ C,C ;to LH
HRRI C,4(F) ;first text wd
MOVEM C,DLHED
HRRZ C,(F) ;total wdcount
HRL C,C ;in both halves
ADD F,C ;update textptr
SETZM -1(F) ;Sigh. To stop text group.
MOVE C,TRLBLK
ADD C,[-40,,-1]
HRRZ D,F
JOBRD A,
JRST NEMOD2
HRRZ C,(F) ;total wdcount
ADDI C,-2(F) ;last text wd
HRLZ C,C ;to LH
HRRI C,4(F) ;first text wd
MOVEM C,DLTRL
HRRZ C,(F) ;total wdcount
HRL C,C ;in both halves
ADD F,C ;update textptr
SETZM -1(F) ;Sigh. To stop text group.
EWINLP: MOVE C,ANXTLN
CAMN C,ABOTST
JRST EWINDN ;finished (bottom of page)
AOBJP E,EWINDN;finished (MAXWIN lines done)
JUMPGE F,EWINDN;out of space (in text area)
ADD C,[-40,,-1]
HRRZ D,F
JOBRD A,
JRST NEMOD2
HRRZ C,1(F)
MOVEM C,ANXTLN
HRRZ C,(F) ;total wdcount
ADDI C,-2(F) ;last text wd
SKIPGE 3(F)
SUBI C,3 ;correct last wd adr if page mark line
HRLZ C,C ;to LH
HRRI C,4(F) ;first text wd
MOVEM C,(E)
HRRZ C,(F) ;total wdcount
CAILE C,100
JRST NEMOD2
HRL C,C ;in both halves
ADD F,C ;update textptr
SETZM -1(F) ;Sigh. To stop text group.
JRST EWINLP
EWINDN:
MOVEI A,DLIST
CAIA
NEMOD2: MOVEI A,DLISTL
MOVEM A,DLISTP
HRRZ A,(A)
HRLI A,444400
MOVEM A,WRDP
MOVEI F,0
MOVEI NLFS,0
MOVEI LEN,0
MOVE PNT,[POINT 7,PPAGE+2]
LF1: PUSHJ P,RCH
JRST LINED
CAIN C,12
JUMPE F,[ MOVEI C,40
IDPB C,PNT
MOVEI C,15
IDPB C,PNT
MOVEI C,12
IDPB C,PNT
ADDI LEN,3
ADDI NLFS,1
JRST LF1]
MOVE F,C
SUBI F,12
IDPB C,PNT
CAIN C,12
JRST [ADDI NLFS,1
AOJA LEN,LF1]
AOJA LEN,LF1
MOVEM F,NEEDLF#
EINIT: SKIPE EINITD
JRST CPOPJ1
MOVE B,LINN
TTYJOB B,
JUMPLE B,CPOPJ
SEGNUM B,
JUMPE B,CPOPJ
DETSEG 0,
PUSH P,[EINRET] ;set exit to re-do GETHI
ATTSEG B,
POPJ P,
MOVE A,400011 ;addr(BOTSTR)
HRRZM A,ABOTST
MOVE A,400016 ;addr(DRAW)
MOVE A,3(A) ;DRAW+3: JRST DRAWM
HLRZ B,A
CAIE B,(<JRST>)
POPJ P,
MOVE A,0(A) ;DRAWM: PUSHJ P,DISP0
HLRZ B,A
CAIE B,(<PUSHJ 17,>)
POPJ P,
MOVE A,4(A) ;DISP0+4: PUSHJ P,WINCHK
HLRZ B,A
CAIE B,(<PUSHJ 17,>)
POPJ P,
MOVE C,A ;save PUSHJ P,WINCHK
MOVE A,-12(A) ;WINCHK-12: MOVEM T,WINLIN#
HLRZ B,A
CAIE B,(<MOVEM 15,>)
POPJ P,
HRRZM A,AWINLI
MOVE A,2(C) ;WINCHK+2: JRST CENWIN
HLRZ B,A
CAIE B,(<JRST>)
POPJ P,
MOVE A,3(A) ;CENWIN+3: AOJA A,SETWIN
HLRZ B,A
CAIE B,(<AOJA 1,>)
POPJ P,
MOVE C,A ;save AOJA A,SETWIN
MOVE A,6(A) ;SETWIN+6: MOVEM B,HEDBLK#
HLRZ B,A
CAIE B,(<MOVEM 2,>)
POPJ P,
HRRZM A,AHEDBL
MOVE A,12(C) ;SETWIN+12: MOVEM B,TRLBLK#
HLRZ B,A
CAIE B,(<MOVEM 2,>)
POPJ P,
HRRZM A,ATRLBL
SETOM EINITD
JRST CPOPJ1
EINRET: CAIA
AOS (P)
MOVE A,XGETHI
GETHI A,
HALT .
POPJ P,
LINED: MOVE DAT,@LEENT ; append line editor
SKIPN DAT
JRST LFEND
ADD DAT,DLEBUF ;Point to buffer itself
HRRZ CB,CCHKBEG ;BREAK IN NON-SHUFFLING SYSTEM
CAIGE CB,(DAT) ;PAST BREAK IN SYSTEM?
ADD DAT,CBMST ;ADD CHKBEG-SYSTOP
ADDI DAT,400000 ;I CONTAINS RELOCATION OF SYSTEM
MOVE F,DAT ;Make copy of pointer for depositing
MOVEI A,1
LIE: TDNE A,(DAT) ;Is this a text word?
AOJA DAT,LIE ;Yes
CNTDN: CAMN F,DAT
JRST LFEND ;Empty line editor
HRLI F,440700
SUBI DAT,1 ;Point to last real text word in buffer
HRLI DAT,100700 ;Byte pointer to char before EOLCHR in buffer
MOVEM LEN,SAVLEN# ;in case LE ends with crlf(ie its been sent),
MOVEM PNT,SAVPNT# ;save len and pnt so we can back up
LECS: CAMN F,DAT ;check if end overstepped
JRST LFOO
ILDB C,F
CAIE C,177
CAIN C,14 ;stop on funny characters
JRST LFOO
CAIE C,13
CAIN C,0
JRST LFOO
CAIE C,15 ;if line ends in <cr> or <lf>
CAIN C,12 ;its already been sent, dont dpy it
JRST BACKUP
CAIN C,175
JRST BACKUP
IDPB C,PNT ;normally, deposit
AOJA LEN,LECS ;and account
LFOO: SETOM NEEDLF ;we didn't insert crlf
JRST LFEND
BACKUP: SKIPN EMODE ;if E mode, don't ever flush line editor
JRST BACKPU
CAIE C,12
SETOM NEEDLF
JRST LFEND
BACKPU: MOVE PNT,SAVPNT ;restore depositing byte pntr
MOVE LEN,SAVLEN ;and character cnt
LFEND: SKIPN NEEDLF ;check if last line had lf
JRST LFDONE ;if so, don't add extra one
MOVEI C,40
IDPB C,PNT ;otherwise add space cr lf
MOVEI C,15
IDPB C,PNT
MOVEI C,12
IDPB C,PNT
ADDI LEN,3
ADDI NLFS,1
LFDONE: SKIPLE DPYHT ;if not a display, type out whole buffer
CAMN NLFS,DPYHT ;if just right number of lines
JRST DISP1 ;display immediately
CAML NLFS,DPYHT ;if too few
JRST SQUISH
SPLOO: MOVEI C,40 ;add blank lines
IDPB C,PNT
MOVEI C,15
IDPB C,PNT
MOVEI C,12
IDPB C,PNT
ADDI LEN,3
ADDI NLFS,1
CAMGE NLFS,DPYHT
JRST SPLOO
JRST DISP1
SQUISH: MOVE A,[POINT 7,PPAGE+2] ;must be too many lines, remove some
SQUASH: ILDB C,A
CAIE C,12
JRST SQUASH
SUBI NLFS,1
CAMLE NLFS,DPYHT
JRST SQUASH
MOVE PNT,[POINT 7,PPAGE+2]
SETZ LEN,
SQUOSH: ILDB C,A
IDPB C,PNT
ADDI LEN,1
CAIE C,12
JRST SQUOSH
SOJG NLFS,SQUOSH
MOVE NLFS,DPYHT
DISP1: MOVEI C,0
REPEAT 10,{IDPB C,PNT}
movei c,6(len) ;find number of words for string
idivi c,5
addi c,3+1
hrrm c,buffpt+1
movni a,1
getlin a ;get type of terminal
TLNE A,40000
JRST [MOVE B,DMAGE ;its a DM
MOVEM B,PPAGE
MOVE B,DMAGE+1
MOVEM B,PPAGE+1
JRST GIOT]
tlne a,20000
JRST [MOVE B,DDAGE ;its a DD
MOVEM B,PPAGE
MOVE B,DDAGE+1
MOVEM B,PPAGE+1
JRST GIOT]
TLNE A,400000
JRST [MOVE B,IIAGE ;its a III
MOVEM B,PPAGE
MOVE B,IIAGE+1
MOVEM B,PPAGE+1
PGACT 400000
DPYPOS -1000
JRST GIOT]
JRST [outstr PPAGE+2 ;not a dd - let outstr handle it.
JRST PRTD]
GIOT: UPGIOT BUFFPT
SETOM PPAGE-1(C) ;set low order bit (DD UPG's clobber it)
PRTD: MOVEI A,1
SLEEP A,
MOVE A,LINN
INCHRS B
JRST BEG
CAIN B,175
JRST ALOU
CAIN B,15
JRST [INCHRW B
ALOU: RESET
move a,respag ;block to reset the page printer
ttyset a,
MOVEI A,1
SLEEP A,
EXIT 1,
JRST START]
MOVE A,TESTXX
CAIN A,=0
JRST PRTDX
CAIE B,"E"
CAIN b,"e"
JRST [SETOM EMODE ;Set E mode
JRST BEG]
CAIE B,"N"
CAIN b,"n"
JRST [SETZM EMODE ;Clear E mode - back to normal
JRST BEG]
PRTDX: MOVE A,B
JRST HACH
RCHNW: MOVE C,[700,,WRD-1]
MOVEM C,CHRP
MOVEI C,5
MOVEM C,CCNT
RCHNW2: ILDB C,WRDP
TRNN C,1
JRST RCHNB
MOVEM C,WRD
RCH: SOSGE CCNT
JRST RCHNW
ILDB C,CHRP
JUMPE C,RCH
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
RCHNB: MOVE A,DLISTP
CAIN A,DLISTL
JRST RCHNC ;jump if looking at plain old PP
HLRZ A,(A) ;max WRDP
HLL A,WRDP
CAML A,WRDP
JRST RCHNW2 ;max ≤ WRDP, keep going
AOS A,DLISTP
HRRZ A,(A)
JUMPE A,RCHNB ;skip zero entries
HRLI A,444400
MOVEM A,WRDP
JRST RCHNW2
RCHNC: CAMN C,ENDTST
POPJ P,
ADD C,JMPOFF
TRNN C,-1
AOSLE BLKCNT
POPJ P,
HLRM C,WRDP
JRST RCHNW2
APNT: (A). ;RH GETS CLOBBERED AT SETPR2 TIME
WRD: 0↔-1
ENDTST: 20
IBUF: BLOCK 3
OBUF: BLOCK 3
ENTR: BLOCK 4
FILE: BLOCK 4
PDL: BLOCK LPDL
EXIT 1,
JBTLIN: 0
LETAB: 0
PPCALL: 0
TPJMP: 0
TBLKPT: 0
DPYHT: 0
LINN: 0
CHRP: 0
BLKCNT: 0
CCNT: 0
WRDP: 0
JMPOFF: 0
LEENT: 0
CBMST: 0
DLEBUF: 0
XGETHI: 0
CCHKBEG: 0
EMODE: 0 ;nozero if in E mode
EINITD: 0
DLISTP: 0
DLIST:
DLHED: 0 ;for E window header
WINBLK: BLOCK MAXWIN ;for E window lines
DLTRL: 0 ;for E window trailer
DLISTL: 0 ;for PP
; XDPYBU+DPYBSZ-1,,XDPYBU ;for E body
WINLIN: 0
HEDBLK: 0
TRLBLK: 0
ANXTLN: 0
buffpt: 200000,,PPAGE ;double field mode
0
0
PPAGE+1
ersbuf: BYTE (8) 17,0,46 (3) 1,2,1,4 ;funct. code, chan select, funct. code
0
erspt: ersbuf
erspt-ersbuf
0
0
DDAGE: BYTE (8) 46,0,46 (3) 1,2,1,4
BYTE (8) 2,1,10 (3)3,4,5,4
DMAGE: BYTE (7) 177,30,177,30,177
BYTE (7) 30,177,14,140,142
IIAGE: BYTE (11) -1000,700 (3) 0,0 (1) 0,1 (2) 2 (4) 6
BYTE (11) -1000,700 (3) 0,0 (1) 0,1 (2) 2 (4) 6
PPAGE: BYTE (8) 46,0,46 (3) 1,2,1,4
BYTE (8) 2,1,10 (3)3,4,5,4
REPEAT BFSZ,{1}
WINTXT: BLOCK WTXTSZ
END START